Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB.net]interagire con i MediaButton
Forum - C# / VB.NET - [VB.net]interagire con i MediaButton

Avatar
walker93 (Member)
Expert


Messaggi: 460
Iscritto: 31/01/2010

Segnala al moderatore
Postato alle 20:25
Sabato, 30/10/2010
Questo topic è stato chiuso dal moderatore

Sto facendo un riproduttore musicale e fino adesso funziona tutto al meglio
Però voelvo anche inserire l'interagibilità con i MediaButton della tastiera:

Keys.MediaNextTrack
Keys.MediaPlayPause
Keys.MediaPreviousTrack
Keys.MediaStop
Keys.VolumeDown
Keys.VolumeMute
Keys.VolumeUp

il problema è che utilizzando la funzione GetAsyncKeyState all'interno di un timer per capire se quei tasti sono premuti, succede che ogni <interval del timer> se sto tenendo premuto il pulsante viene continuamente chiamata la procedura associata al pulsante
Ad esempio:
se sto gestendo il VolumeMute e l'intervallo del timer è 100ms, ogni 100ms il programma mette muto e mette l'audio praticamente a intermittenza.
Come posso ovviare questo problema?

Ultima modifica effettuata da walker93 il 30/10/2010 alle 20:26
PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Up
1
Down
V
Segnala al moderatore
Postato alle 15:08
Domenica, 31/10/2010
Usa degli switch, variabili booleane, eccetera...

PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Up
1
Down
V
Segnala al moderatore
Postato alle 18:09
Martedì, 02/11/2010
Sì:
Testo quotato

If the function succeeds, the return value specifies whether the key was pressed since the last call to GetAsyncKeyState, and whether the key is currently up or down. If the most significant bit is set, the key is down, and if the least significant bit is set, the key was pressed after the previous call to GetAsyncKeyState. However, you should not rely on this last behavior; for more information, see the Remarks.

The return value is zero for the following cases:

The current desktop is not the active desktop
The foreground thread belongs to another process and the desktop does not allow the hook or the journal record.



Tuttavia, se leggi dopo, c'è scritto che questo comportamento è inaffidabile a causa della preemption.

PM
Avatar
walker93 (Member)
Expert


Messaggi: 460
Iscritto: 31/01/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 20:52
Domenica, 31/10/2010
avevo provato a disattivare il timer quando aveva eseguito già una volta il comando, ma visto che nel timer controllo quando il tasto era premuto se lo disattivo non riuesco più a capire quando il tasto non è più premuto.
Dovrei utilizzare 2 timer:
uno controlla quando un tasto viene premuto e nel caso avvia la procedura,il secondo timer e ferma questo timer.
l'altro controlla quando il tasto non è più premuto e nel caso riabilità il primo timer e ferma questo.

solo che mi scoccia veramente tanto usare 2 timer per dei tasti

PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Up
0
Down
V
Segnala al moderatore
Postato alle 15:39
Lunedì, 01/11/2010
Puoi usare un dizionario Keys > TimeSpan. Il timespan associato ad ogni tasto indica quanto tempo è passato dall'ultima volta che è stato rilevato come premuto. Se è maggiore di, diciamo, 0.8 secondi, allora lo processi, altrimenti lo ignori. Basta un solo timer.

PM
Avatar
walker93 (Member)
Expert


Messaggi: 460
Iscritto: 31/01/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 18:05
Lunedì, 01/11/2010
Proverò a usare il timespan...
Ma permettimi un'altra domanda:
con
If GetAsyncKeyState(Tasto) <> 0 then
controllo quando un tasto è premuto(fisicamente schiacciato)

con un altro numero che non sia 0 posso controllare il "keydown" cioè solo quando il tasto scende?
If GetAsyncKeyState(Tasto) = 1024 '(numero inventato)

in questo modo anche se il tasto è premuto al prossimo tick del timer, non entra nella condizione perchè non sta scendendo ma è già sceso completamente...

PM
Avatar
walker93 (Member)
Expert


Messaggi: 460
Iscritto: 31/01/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 17:28
Mercoledì, 03/11/2010
ho provato con il dizionario e il timespan senza successo...
cosi ho usato con un array e adesso funziona tutto come previsto.
Grazie

PM